package model;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import model.core.CheckPointCore;
import parameter.ParameterItineraire;
import referential.Position;
import referential.TypeEuropeen;
import referential.TypeOrignalité;

public class CheckPoint extends CheckPointCore implements ParameterItineraire {
  
  protected List<List<Itineraire>> listPassage;
  protected Position[] listDepartArrivee = new Position[]{new Position(7.735485434532165,48.58491866531714 ),
      new Position(7.753894495879356,48.574770926577919),
      new Position(7.772882965498256,48.577231874869177),
      new Position(7.742559741702301,48.585343911511941),
      new Position(7.766834499333363,48.59933257016101)};
  
  public CheckPoint() {
    super();
  }

  public CheckPoint(Integer id, String name, String groupe, String titreActivité, int nombreEquipe, int absorption, Position position, int durée, TypeOrignalité originalité, boolean obligatoire, boolean regionnal, TypeEuropeen europeen, boolean interaction,
      boolean vivreEnsemble, boolean creatif, boolean intellectuel, boolean physique, boolean theatre, boolean stimulante, boolean fierte, boolean funitude, boolean confrontation, boolean mobilisation, boolean proximite,
      boolean institution, boolean kehl) {
    super(id, name, groupe, titreActivité, nombreEquipe, absorption, position, durée, originalité, obligatoire, regionnal, europeen, interaction, vivreEnsemble, creatif, intellectuel, physique, theatre, stimulante, fierte, funitude, confrontation,
        mobilisation, proximite, institution, kehl);
    
    this.listPassage = new ArrayList<List<Itineraire>>();
    for (int i = 0; i < NB_CHECK_POINT_PAR_ITINERAIRE; i++) {
      this.listPassage.add(new ArrayList<Itineraire>());
    }
  }
  
  public boolean estUneActiviteLongue() {
    return getDurée()>= SEUIL_MINUTE_ACTIVITE_LONGUE;
  }

  public boolean estUneActivitéOriginal() {
    return LIST_ORIGINALITE.contains(getOriginalité()) ;
  }

  
  public boolean estUneActivitéEuropeene() {
    return LIST_EUROPEEN.contains(getEuropeen()) ;
  }
  
  @Override
  public boolean isProximite() {
    for (int i = 0; i < listDepartArrivee.length; i++ ) {
      Position depArr = listDepartArrivee[i];
      double distance =depArr.getDistance(getPosition());
      if (distance >= DISTANCE_MIN_ENTRE_DEUX_CHECKPOINT && distance <= DISTANCE_MAX_ENTRE_DEUX_CHECKPOINT){
        return true;
      }
    }
    return false;
  }

  public String toString() {
    StringBuffer resultat = new StringBuffer();
    resultat.append("id = ").append(this.getId()).append(" - ").append(this.getTitreActivité());
    return resultat.toString();
  }

  /**
   * ajoute un passage au niveau du passage de l'itineraire
   * @param itineraire : l'itineraire qui se construit
   * @return : true si l'ajout a pu s'effectuer, false si le nombre d'équipe max est atteint
   */
  public void ajouterPassage(Itineraire itineraire) {
    int i = itineraire.getNbEtape();
    ajouterPassage(itineraire, i);
  }
  
  public void ajouterPassage(Itineraire itineraire, int i) {
    List<Itineraire> itineraireDeLEtape = null;
    try {
      itineraireDeLEtape = listPassage.get(i);
    } catch (IndexOutOfBoundsException ignored) {
    }
    if (itineraireDeLEtape == null) {
      itineraireDeLEtape = new ArrayList<Itineraire>();
      this.listPassage.add(i,itineraireDeLEtape);
    }
    
    itineraireDeLEtape.add(itineraire);
  }

  public boolean respecteLesQuotas(int i) {
    List<Itineraire> listEtape = this.listPassage.get(i);
    if (i == 0) {
      return (listEtape.size() <= (getAbsorption()/2));
    }
    return (listEtape.size() <= getAbsorption());
  }
  
  public boolean respecteLesQuotasPlus1(int i) {
    List<Itineraire> listEtape = this.listPassage.get(i);
    return (listEtape.size() < getAbsorption());
  }
  
  public boolean isFullBooked() {
    for(int i = 0 ; i<listPassage.size();i++) {
      if (listPassage.get(i).size() <= getAbsorption()) {
        return true;
      }
    }
    return false;
  }

  public void retirerPassage(Itineraire itineraire, int etape) {
    List<Itineraire> list = this.listPassage.get(etape);
    list.remove(itineraire);
  }

  public List<List<Itineraire>> getListPassage() {
    return listPassage;
  }
  
  public String toCSV() {
    StringBuffer resultat = new StringBuffer();
    resultat.append(">>>>>>>>>>>>>>>>> ").append(getTitreActivité()).append("<<<<<<<<<<<<<<<<<").append(CSV_LINE_DELIMITER);
    int numPassage = 1;
    for (Iterator<List<Itineraire>> itList = getListPassage().iterator(); itList.hasNext();) {
      List<Itineraire> listItineraire = itList.next();
      resultat.append(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>Passage "+numPassage++ + CSV_LINE_DELIMITER);
      for (Iterator<Itineraire> itItineraire = listItineraire.iterator(); itItineraire.hasNext();) {
        Itineraire itineraire = itItineraire.next();
        //resultat.append(itineraire.getNumero()).append(CSV_LINE_DELIMITER);
      }
    }
    return resultat.toString();
  }

  public String printReporting() {
    StringBuffer resultat = new StringBuffer();
    resultat.append(getTitreActivité()).append(CSV_CELL_DELIMITER);
    int numPassage = 1;
    for (Iterator<List<Itineraire>> itList = getListPassage().iterator(); itList.hasNext();) {
      List<Itineraire> listItineraire = itList.next();
      resultat.append("Passage ").append(numPassage++).append(CSV_CELL_DELIMITER).append(listItineraire.size()).append(CSV_CELL_DELIMITER);
    }
    resultat.append(CSV_LINE_DELIMITER);
    return resultat.toString();
  }
  
  public boolean isGroupe() {
    return false;
  }


}
